package com.ucampus.service;

import com.ucampus.dao.userLoginMapper;
import com.ucampus.entity.user;
import com.ucampus.entity.userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 功能：
 * 作者： 启明星_Polaris
 * 日期：2024/12/27 上午9:30
 **/

@Service
public class userLoginServiceImpl implements userLoginService {

    @Autowired
    private userLoginMapper userLoginMapper;

    @Override
    public boolean loginById(long id, String userpassword) {
        // 验证 id 与 password
        String storedEncryptedPassword = userLoginMapper.getEncryptedPasswordById(id);

        user currentUser = userLoginMapper.findUserById(id);

        // 检查用户是否存在以及状态是否为 "active"
        if (currentUser == null || !"可用".equalsIgnoreCase(currentUser.getStatus())) {
            return false; // 用户状态不可用或不存在
        }

        boolean isValid = validatePassword(userpassword, storedEncryptedPassword) ;

        if(isValid) {
            // 登录后生成新的 Token
            String token = generateToken();
            LocalDateTime currentTime = LocalDateTime.now();
            LocalDateTime expiretime = LocalDateTime.now().plusHours(12);

            // 更新用户的 Token 和过期时间
            userLoginMapper.updateToken(id,token,currentTime,expiretime);

            // 登录成功，返回 true
            return true;
        }

        return false;
    }

    @Override
    public boolean loginByPhone(String phone, String userpassword) {
        // 根据手机号查询id
        Integer id = userLoginMapper.getIdByPhone(phone);
        // 验证 id 与 password
        String storedEncryptedPassword = userLoginMapper.getEncryptedPasswordById(id);

        // 检查用户是否存在以及状态是否为 "active"
        user currentUser = userLoginMapper.findUserById(id);

        if (currentUser == null || !"可用".equalsIgnoreCase(currentUser.getStatus())) {
            return false; // 用户状态不可用或不存在
        }
        boolean isValid = validatePassword(userpassword, storedEncryptedPassword) ;
        if (id == null || !isValid) {
            return false;
        }

        // 生成新的 Token
        String token = generateToken();
        LocalDateTime currentTime = LocalDateTime.now();
        LocalDateTime expiretime = LocalDateTime.now().plusHours(12);

        // 更新用户的 Token 和过期时间
        userLoginMapper.updateToken(id,token,currentTime,expiretime);

        // 用 id 和 password 验证登录
        return true;
    }

    @Override
    public boolean loginByWX(String wx, String userpassword) {
        Integer id = userLoginMapper.getIdByWX(wx);
        // 验证 id 与 password
        String storedEncryptedPassword = userLoginMapper.getEncryptedPasswordById(id);
        // 检查用户是否存在以及状态是否为 "active"

        user currentUser = userLoginMapper.findUserById(id);

        if (currentUser == null || !"可用".equalsIgnoreCase(currentUser.getStatus())) {
            return false; // 用户状态不可用或不存在
        }
        boolean isValid = validatePassword(userpassword, storedEncryptedPassword) ;
        if (id == null || !isValid) {
            return false;
        }

        // 生成新的 Token
        String token = generateToken();
        LocalDateTime currentTime = LocalDateTime.now();
        LocalDateTime expireTime = LocalDateTime.now().plusHours(12);

        // 更新用户的 Token 和过期时间
        userLoginMapper.updateToken(id, token, currentTime, expireTime);
        return true;
    }

    @Override
    public boolean loginByQQ(String qq, String userpassword) {
        Integer id = userLoginMapper.getIdByQQ(qq);
        // 验证 id 与 password
        String storedEncryptedPassword = userLoginMapper.getEncryptedPasswordById(id);
        // 检查用户是否存在以及状态是否为 "active"

        user currentUser = userLoginMapper.findUserById(id);

        if (currentUser == null || !"可用".equalsIgnoreCase(currentUser.getStatus())) {
            return false; // 用户状态不可用或不存在
        }
        boolean isValid = validatePassword(userpassword, storedEncryptedPassword) ;
        if (id == null || !isValid) {
            return false;
        }

        // 生成新的 Token
        String token = generateToken();
        LocalDateTime currentTime = LocalDateTime.now();
        LocalDateTime expireTime = LocalDateTime.now().plusHours(12);

        // 更新用户的 Token 和过期时间
        userLoginMapper.updateToken(id, token, currentTime, expireTime);
        return true;
    }

    @Override
    public boolean bindAccount(long id, String phone, String qq, String wx) {
        user existingUser = userLoginMapper.findUserById(id);
        if (existingUser == null) return false;
        existingUser.setUserPhone(phone);
        existingUser.setUserQQ(qq);
        existingUser.setUserWX(wx);
        userLoginMapper.updateUser(existingUser);
        return true;
    }

    // 生成 Token
    public String generateToken() {
        return UUID.randomUUID().toString();
    }


    // 更新用户的 Token 和有效时间
    @Override
    public boolean validateToken(String token, String userIdFromRequest) {
        // 查询数据库中的用户 Token
        user currentUser = userLoginMapper.findUserByToken(token);
        if (currentUser == null) {
            System.out.println("Token not found in database for user: " + userIdFromRequest);
            return false; // Token 不存在
        }

        System.out.println("Token found in database for user ID: " + currentUser.getId());

        // 验证 ID 一致性
        if (!String.valueOf(currentUser.getId()).equals(userIdFromRequest)) {
            System.out.println("User ID mismatch: Token belongs to user " + currentUser.getId() + ", but request has user ID " + userIdFromRequest);
            return false; // 用户 ID 不一致，Token 无效
        }

        // 验证 Token 是否过期
        if (currentUser.getExpiretime().isBefore(LocalDateTime.now())) {
            System.out.println("Token expired for user: " + currentUser.getId());
            return false; // Token 已过期
        }

        // 延长 Token 有效期
        if (currentUser.getExpiretime().minusMinutes(10).isBefore(LocalDateTime.now())) {
            currentUser.setExpiretime(LocalDateTime.now().plusHours(12)); // 延长 12 小时
            userLoginMapper.updateToken(currentUser.getId(), currentUser.getToken(), currentUser.getCreatetime(), currentUser.getExpiretime());
            System.out.println("Token expiry extended for user: " + currentUser.getId());
        }

        return true; // Token 有效
    }
    @Override
    public userinfo getUserInfoById(long id) {
        // 通过 ID 查询用户信息表
        return userLoginMapper.findUserInfoById(id);
    }

//     自定义加密验证逻辑
//     @param inputPassword 用户输入的原始密码
//     @param storedEncryptedPassword 数据库中存储的加密密码
//     @return 验证是否成功

    // 解密匹配密码
    @Override
    public user getUserByToken(String token) {
        return userLoginMapper.findUserByToken(token);
    }

    private boolean validatePassword(String inputPassword, String storedEncryptedPassword) {
        if (storedEncryptedPassword == null || storedEncryptedPassword.isEmpty()) {
            return false; // 如果数据库中没有存储密码，则直接返回false
        }

        // 1. 对用户输入的密码进行第一次MD5加密
        String firstMd5 = DigestUtils.md5DigestAsHex(inputPassword.getBytes());

        // 2. 获取用户输入密码的倒序
        String reversedPassword = new StringBuilder(inputPassword).reverse().toString();

        // 3. 拼接第一次MD5加密结果和倒序密码
        String finalEncryptedPassword = reversedPassword + firstMd5;

        // 4. 验证加密密码是否匹配
        return finalEncryptedPassword.equals(storedEncryptedPassword);
    }
}